Coroutine
CoroutineTest.cs
using UnityEngine;
using XLua;
public class CoroutineTest : MonoBehaviour {
LuaEnv luaenv = null;
// Use this for initialization
void Start()
{
luaenv = new LuaEnv();
luaenv.DoString("require 'coruntine_test'");
}
// Update is called once per frame
void Update()
{
if (luaenv != null)
{
luaenv.Tick();
}
}
void OnDestroy()
{
luaenv.Dispose();
}
}
coroutine_test.lua.txt
local util = require 'xlua.util'
local yield_return = (require 'cs_coroutine').yield_return
local co = coroutine.create(function()
print('coroutine start!')
local s = os.time()
yield_return(CS.UnityEngine.WaitForSeconds(3))
print('wait interval:', os.time() - s)
local www = CS.UnityEngine.WWW('http://www.qq.com')
yield_return(www)
if not www.error then
print(www.bytes)
else
print('error:', www.error)
end
end)
assert(coroutine.resume(co))
cs_coroutine.lua.txt
local util = require 'xlua.util'
local gameobject = CS.UnityEngine.GameObject('Coroutine_Runner')
CS.UnityEngine.Object.DontDestroyOnLoad(gameobject)
local cs_coroutine_runner = gameobject:AddComponent(typeof(CS.Coroutine_Runner))
local function async_yield_return(to_yield, cb)
cs_coroutine_runner:YieldAndCallback(to_yield, cb)
end
return {
yield_return = util.async_to_sync(async_yield_return)
}
Coroutine_Runner.cs
using UnityEngine;
using XLua;
using System.Collections.Generic;
using System.Collections;
using System;
[LuaCallCSharp]
public class Coroutine_Runner : MonoBehaviour
{
public void YieldAndCallback(object to_yield, Action callback)
{
StartCoroutine(CoBody(to_yield, callback));
}
private IEnumerator CoBody(object to_yield, Action callback)
{
if (to_yield is IEnumerator)
yield return StartCoroutine((IEnumerator)to_yield);
else
yield return to_yield;
callback();
}
}
public static class CoroutineConfig
{
[LuaCallCSharp]
public static List<Type> LuaCallCSharp
{
get
{
return new List<Type>()
{
typeof(WaitForSeconds),
typeof(WWW)
};
}
}
}
🔚